package com.aps.framework.exception;

/**
 * 业务异常类
 *
 * @author APS Scaffold
 */
public class BusinessException extends RuntimeException {
    // 错误码（关联枚举）
    private final ErrorCode errorCode;

    /**
     * 创建业务异常 默认错误码500
     */
    public static BusinessException of(String message) {
        return new BusinessException(message);
    }

    /**
     * 创建业务异常
     */
    public static BusinessException of(ErrorCode errorCode) {
        return new BusinessException(errorCode);
    }

    /**
     * 创建业务异常
     */
    public static BusinessException of(ErrorCode errorCode, String message) {
        return new BusinessException(errorCode, message);
    }

    // 构造方法1：仅传入错误码（使用枚举的默认信息）
    public BusinessException(ErrorCode errorCode) {
        super(errorCode.getDefaultMessage()); // 调用父类构造方法传入message
        this.errorCode = errorCode;
    }

    // 构造方法2：传入错误码 + 自定义错误信息（覆盖默认信息）
    public BusinessException(ErrorCode errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }

    // 构造方法3：传入错误码 + 异常原因（保留堆栈信息）
    public BusinessException(ErrorCode errorCode, Throwable cause) {
        super(errorCode.getDefaultMessage(), cause); // 携带原因
        this.errorCode = errorCode;
    }

    // 构造方法4：传入错误码 + 自定义信息 + 异常原因（最完整）
    public BusinessException(ErrorCode errorCode, String message, Throwable cause) {
        super(message, cause);
        this.errorCode = errorCode;
    }

    // 构造方法5：异常原因 默认错误码500
    public BusinessException(String message) {
        super(message);
        this.errorCode = ErrorCode.INTERNAL_SERVER_ERROR;
    }

    // 获取错误码
    public Integer getErrorCode() {
        return errorCode.getCode();
    }
}
